package com.zzg.demo.laboratory.threadpool;

import java.time.LocalDateTime;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;

public class TestSynchronousQueue {

    /**
     * SynchronousQueue：
     * 同步队列的作用类似于一种匹配原则，它只能放一个东西进去。
     * 场景：
     * 一个线程放数据进去，另一个线程去取。放进去的线程放进去以后， 就要等待消费者去取， 只有取出来了才可以继续放进去，同时，消费者也是只有等生产者放进去才可以取， 如果没有， 就只有继续等待。
     * ————————————————
     * 版权声明：本文为CSDN博主「正月看飞雪」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
     * 原文链接：https://blog.csdn.net/qq_45432665/article/details/119173391
     * @param args
     */
    public static void main(String[] args) {
        SynchronousQueue<String> queue = new SynchronousQueue<>();
        new Thread(() -> {
            try {
                System.out.println(LocalDateTime.now() + "-" + Thread.currentThread().getName() + "-put 1");
                queue.put("1");
                System.out.println(LocalDateTime.now() + "-" + Thread.currentThread().getName() + "-put 1");
                queue.put("1");
                System.out.println(LocalDateTime.now() + "-" + Thread.currentThread().getName() + "-put 1");
                queue.put("1");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "T1").start();

        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(3);
                System.out.println(LocalDateTime.now() + "-" + Thread.currentThread().getName() + queue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(LocalDateTime.now() + "-" + Thread.currentThread().getName() + queue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(LocalDateTime.now() + "-" + Thread.currentThread().getName() + queue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "T2").start();

    }
}
